1. Theory

LearnOpenGL - PBR - Theory

이론 (Theory)

PBR(Physically Based Rendering, 물리 기반 렌더링)는 물리적 세계와 더 유사한 이론을 기반으로 한 렌더링 기술의 집합입니다. 물리 기반 렌더링은 빛을 물리적으로 타당한 방식으로 모방하는 것을 목표로 하므로, 기존의 Phong 및 Blinn-Phong 조명 알고리즘보다 일반적으로 더 현실적인 결과를 제공합니다.

또한, PBR은 실제 물리를 근사하기 때문에 아티스트들이 표면 재질을 물리적 매개변수를 기반으로 제작할 수 있어, 조명을 보기 좋게 만들기 위해 임시적인 트릭이나 조정을 사용할 필요가 없습니다. 이러한 물리적 매개변수를 기반으로 재질을 제작하는 가장 큰 장점 중 하나는, 조명 조건에 관계없이 재질이 일관되게 올바르게 보인다는 점입니다. 반면, 비-PBR 파이프라인에서는 조명 조건이 달라지면 재질이 다르게 보일 수 있습니다.

하지만, 물리 기반 렌더링도 결국 물리적 원리를 기반으로 한 근사(approximation) 방식이므로, 실제 물리적 셰이딩(Physical Shading)이라고 부르지는 않고 물리 기반 셰이딩(Physically Based Shading) 이라고 부릅니다. PBR 조명 모델이 물리적으로 기반한 것으로 간주되려면 다음 세 가지 조건을 만족해야 합니다 (걱정 마세요, 곧 자세히 설명할 예정입니다).

  1. 미세면(Microfacet) 표면 모델을 기반으로 해야 합니다.
  2. 에너지를 보존(Energy Conserving)해야 합니다.
  3. 물리 기반 BRDF(Bidirectional Reflectance Distribution Function, 양방향 반사 분포 함수)를 사용해야 합니다.

다음 PBR 챕터에서는 Disney에서 처음 연구하고, Epic Games에서 실시간 렌더링에 적용한 PBR 접근 방식을 중점적으로 다룰 것입니다. 이 접근 방식은 메탈릭(Metallic) 워크플로우를 기반으로 하며, 문서화가 잘 되어 있고, 대부분의 인기 있는 게임 엔진에서 널리 채택되었으며, 시각적으로 뛰어난 결과를 제공합니다. 이 챕터를 마치면, 최종적으로 다음과 같은 결과물을 얻게 될 것입니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313092650.png
이제부터 다룰 내용들은 다소 고급 주제이므로, OpenGL과 셰이더 조명에 대한 기본적인 이해가 필요합니다.
특히, 다음과 같은 고급 개념에 대한 이해가 필요할 수 있습니다.

또한, 일부 고급 수학 개념도 다룰 예정이지만, 최대한 이해하기 쉽게 설명하도록 하겠습니다.

2. 미세면(Microfacet) 모델

모든 PBR 기술은 미세면(Microfacet) 이론을 기반으로 합니다.
이 이론에 따르면, 어떤 표면이든 미세한 거울(microfacets) 로 이루어져 있으며, 이들은 각각 완벽하게 반사하는 작은 거울처럼 동작합니다.

표면의 거칠기(roughness) 에 따라 이 작은 거울들의 정렬 방식이 크게 달라질 수 있습니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313092852.png
표면이 거칠수록(rougher), 각 미세면(microfacet)이 표면을 따라 더욱 무질서하게 정렬됩니다.

이러한 미세한 거울들의 정렬 방식이 조명과 반사에 미치는 영향은 다음과 같습니다.

표면의 거칠기에 따라, 특정 벡터 h 에 정렬된 미세면의 비율을 계산할 수 있습니다.
여기서 벡터 h하프 벡터(halfway vector) 로, 조명 방향 l 과 시점(view) 방향 v 의 중간 벡터를 의미합니다.
이 벡터는 다음 공식으로 계산됩니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313103203.png

즉, 거칠기 값이 작을수록(smoother surface) 많은 미세면이 하프 벡터에 정렬되어, 작고 선명한 반사가 발생합니다. 반대로, 거칠기 값이 클수록(rougher surface) 정렬이 불규칙해지며, 흐릿하고 넓게 퍼지는 반사가 나타납니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313103423.png

3. 에너지 보존

미세면 근사는 에너지 보존 형태를 따릅니다. 즉, 방출되는 빛의 에너지는 입사하는 빛의 에너지를 초과해서는 안 됩니다(발광하는 표면 제외). 위의 이미지를 보면, 거칠기가 증가할수록 반사 영역이 넓어지지만, 밝기는 감소하는 것을 확인할 수 있습니다. 만약 반사 강도가 각 픽셀에서 동일하다면, 거친 표면은 더 많은 에너지를 방출하게 되어 에너지 보존 원칙을 위반하게 됩니다. 그렇기 때문에 매끄러운 표면에서는 반사가 더 강하게 보이고, 거친 표면에서는 더 희미하게 보입니다.

에너지 보존을 유지하려면 확산광과 반사광을 명확하게 구분해야 합니다. 빛이 표면에 닿는 순간, 일부는 굴절되고 일부는 반사됩니다. 반사된 부분은 표면에서 바로 튕겨 나가는 빛으로, 이를 반사광(Specular Light)이라고 합니다. 반면, 굴절된 빛은 표면 내부로 들어가 흡수되며, 이를 확산광(Diffuse Light)이라고 합니다.

여기에는 몇 가지 세부 사항이 있습니다. 굴절된 빛이 표면에 닿자마자 즉시 흡수되는 것은 아닙니다. 물리학적으로 빛은 계속 전진하는 에너지를 가진 빔으로 모델링할 수 있으며, 이 빛이 에너지를 잃는 방식은 충돌을 통해서입니다. 각 물질은 작은 입자로 이루어져 있으며, 이 입자들이 빛과 충돌하면서 에너지를 흡수하거나 일부 또는 전체 에너지를 열로 변환합니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313104303.png
일반적으로 모든 에너지가 흡수되는 것은 아니며, 빛은 (대부분) 무작위 방향으로 계속 산란하면서 다른 입자와 충돌하여 에너지가 소진되거나 다시 표면을 빠져나갑니다. 표면을 다시 빠져나오는 빛은 표면의 관측되는 확산(diffuse) 색상에 기여합니다. 그러나 물리 기반 렌더링(PBR)에서는 모든 굴절된 빛이 매우 작은 영역에서 즉시 흡수되고 산란된다는 단순화된 가정을 합니다. 이 과정에서 표면을 더 멀리 빠져나오는 산란된 빛은 무시됩니다. 이러한 효과를 고려하는 셰이더 기법을 서브서페이스 스캐터링(Subsurface Scattering, SSS) 이라고 하며, 피부, 대리석, 왁스 같은 재질의 시각적 품질을 크게 향상시키지만, 성능 비용이 증가하는 단점이 있습니다.

반사와 굴절과 관련된 또 다른 미묘한 차이는 금속 표면(Metallic Surface) 입니다. 금속 표면은 비금속(절연체, Dielectric) 표면과 다르게 빛과 반응합니다. 금속 표면은 반사와 굴절의 기본 원리는 같지만, 굴절된 빛이 내부에서 산란되지 않고 즉시 흡수됩니다. 즉, 금속 표면은 확산광(Diffuse Light)이 전혀 존재하지 않으며, 반사광(Specular Light)만 남습니다. 이러한 명확한 차이로 인해 PBR 파이프라인에서는 금속과 비금속을 다르게 처리하며, 이에 대한 자세한 내용은 후반부에서 다룰 것입니다.

이러한 반사광과 굴절광의 차이는 에너지 보존(Energy Conservation) 과 관련된 중요한 원칙을 도출합니다:
반사된 에너지는 더 이상 표면에 흡수되지 않으며, 따라서 굴절될 수 있는 에너지는 반사 후 남은 에너지만큼 결정됩니다.

이를 보존하기 위해, 먼저 반사 비율(specular fraction)을 계산하여 입사광의 몇 퍼센트가 반사되는지 결정합니다. 그다음, 굴절(확산) 비율은 반사 비율을 기반으로 직접 계산됩니다.

float kS = calculateSpecularComponent(...); // 반사(스펙큘러) 비율
float kD = 1.0 - kS;                        // 굴절(확산) 비율

이 방식을 사용하면, 입사광 중 반사되는 양과 굴절되는 양을 정확하게 계산하면서 에너지 보존 원칙을 준수할 수 있습니다. 따라서 반사광과 확산광의 합이 1.0을 초과할 수 없으며, 입사광의 총 에너지를 초과하지 않도록 보장됩니다. 이는 우리가 이전의 조명 챕터에서 고려하지 않았던 중요한 개념입니다.

반사 방정식 (Reflectance Equation)

이제 렌더 방정식(Render Equation) 이라는 것에 대해 이야기해 보겠습니다. 이는 매우 뛰어난 사람들이 만들어낸 복잡한 방정식으로, 현재 우리가 빛의 시각적 효과를 시뮬레이션하는 데 사용할 수 있는 최고의 모델입니다. 물리 기반 렌더링(PBR)은 이 렌더 방정식의 더 전문화된 버전인 반사 방정식(Reflectance Equation) 을 따릅니다. PBR을 제대로 이해하려면 반사 방정식을 잘 이해하는 것이 중요합니다:
4. Archive/WhiteEngine/Attachments/Pasted image 20250313105604.png
반사 방정식은 처음에는 복잡하게 보일 수 있지만, 우리가 하나씩 분석하면 점차 이해할 수 있게 됩니다. 이 방정식을 이해하려면 방사 측정학(Radiometry) 에 대해 잠깐 알아야 합니다. 방사 측정학은 전자기 복사(Electromagnetic Radiation) , 즉 가시광선 포함한 빛의 측정을 의미합니다. 여러 가지 방사량(Radiometric Quantities)을 사용하여 표면과 방향을 따라 빛을 측정할 수 있지만, 반사 방정식과 관련이 있는 한 가지 중요한 양만을 다루겠습니다. 그것은 방사선(Radiance) 입니다. 방사선은 특정 방향에서 오는 빛의 크기나 강도를 측정하는 데 사용됩니다. 처음에는 방사선이 여러 물리적 양의 조합이기 때문에 이해하기 어려울 수 있지만, 이를 잘 설명하기 위해 먼저 필요한 물리적 양들을 살펴보겠습니다:

방사선의 주요 물리적 양

  1. 방사 플럭스 (Radiant Flux, Φ)

    • 방사 플럭스는 빛의 에너지 전달을 측정한 값으로, 단위는 와트(W) 입니다.
    • 빛은 여러 다른 파장의 에너지를 집합적으로 합친 것이므로, 각 파장은 특정 색상(가시광선 영역)과 관련이 있습니다.
    • 빛의 방출 에너지는 이 다양한 파장의 함수로 볼 수 있습니다.
  2. 가시광선 영역의 파장

    • 390nm에서 700nm 사이의 파장이 가시광선 스펙트럼에 해당하며, 이는 인간의 눈으로 감지할 수 있는 범위입니다.

다음으로, 일광의 각 파장에 따른 에너지를 보여주는 이미지를 살펴보겠습니다:
4. Archive/WhiteEngine/Attachments/Pasted image 20250313105807.png

방사 플럭스 (Radiant Flux)와 색상

방사 플럭스는 다양한 파장의 함수로 이루어진 빛의 총 에너지 영역을 측정합니다. 다양한 파장의 세기를 직접적으로 측정하는 것은 다소 비실용적이므로, 우리는 보통 방사 플럭스RGB 색상 삼중체로 표현합니다. 즉, 빛의 색상으로 나타내는 것입니다. 이 방식은 파장 강도의 변화에 따른 세부 정보를 상당히 잃게 되지만, 시각적 측면에서는 일반적으로 무시할 수 있을 정도로 작은 손실입니다.

입체각 (Solid Angle)

입체각 (ω)단위 구에 투영된 형태의 크기 또는 면적을 나타냅니다. 이 형태가 단위 구에 투영된 면적을 입체각이라고 부릅니다. 입체각을 부피를 가진 방향으로 시각화할 수 있습니다:
4. Archive/WhiteEngine/Attachments/Pasted image 20250313110144.png
단위 구의 중심에 있는 관찰자가 형태의 방향을 바라본다고 상상해 보세요. 그 형태에서 보이는 윤곽선의 크기가 바로 입체각입니다.

방사 강도 (Radiant Intensity)

방사 강도단위 입체각 당 방사 플럭스를 측정한 값으로, 즉 빛의 원천이 단위 구에 투영된 영역에 대해 방출하는 에너지의 세기입니다. 예를 들어, 모든 방향으로 균등하게 방출되는 구형 광원(Omnidirectional Light) 을 고려했을 때, 방사 강도는 특정 영역(입체각)에서의 에너지를 나타냅니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313110318.png
방사 강도를 설명하는 방정식은 다음과 같이 정의됩니다:

4. Archive/WhiteEngine/Attachments/Pasted image 20250313110538.png

여기서, I방사 플럭스(Φ)입체각(ω) 에 대해 나눈 값입니다.

이제 방사 플럭스, 방사 강도, 그리고 입체각에 대한 지식을 바탕으로 방사선(Radiance) 방정식을 설명할 수 있습니다. 방사선은 방사 강도(Φ)입체각(ω) 에 따른 면적 A에서 관찰된 총 에너지를 설명합니다.
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313150034.png
4. Archive/WhiteEngine/Attachments/Pasted image 20250313110825.png
방사선(Radiance)은 면적에서의 빛의 양을 측정하는 방사량 지표이며, 빛이 표면의 법선과 이루는 입사 각도 θ에 의해 조정됩니다. 빛은 표면에 직접적으로 수직으로 비칠수록 강하고, 수직에서 벗어나면 벗어날수록 약해집니다. 이는 기본적인 조명 챕터에서 다룬 확산 조명(Diffuse Lighting) 에서의 우리의 인식과 유사합니다. cosθ는 빛의 방향 벡터와 표면 법선 벡터 간의 내적에 해당합니다:

float cosTheta = dot(lightDir, N);

방사선 방정식은 우리가 관심 있는 대부분의 물리적 양을 포함하고 있기 때문에 매우 유용합니다. 만약 입체각 ω와 면적 A가 무한히 작다고 가정하면, 방사선은 공간의 한 점에 도달하는 빛의 단일 광선의 플럭스를 측정하는 데 사용될 수 있습니다. 이 관계를 통해 우리는 단일 빛의 광선이 한 점(프래그먼트)에 미치는 영향을 계산할 수 있습니다. 우리는 입체각 ω를 방향 벡터 ω로, 면적 A를 점 p로 변환하여, 실질적으로 쉐이더에서 단일 빛 광선의 프래그먼트별 기여도를 계산할 수 있게 됩니다.

사실, 방사선에 관한 한 우리는 일반적으로 한 점 p에 대한 모든 입사광을 다루며, 이는 모든 방사선의 합인 조도(Irradiance) 로 알려져 있습니다. 방사선과 조도를 알면 우리는 다시 반사 방정식(Reflectance Equation) 으로 돌아갈 수 있습니다:

4. Archive/WhiteEngine/Attachments/Pasted image 20250313111252.png

이제 우리는 렌더 방정식에서 L어떤 점 p에서의 방사선과 무한히 작은 입체각 ω_i를 나타낸다는 것을 알게 되었습니다. 이 입체각은 입사 방향 벡터 ω_i로 생각할 수 있습니다. cosθ는 빛이 표면에 입사하는 각도를 기준으로 에너지를 스케일링하는 역할을 하며, 이는 반사 방정식에서 n⋅ω_i로 나타납니다. 반사 방정식은 점 p에서 ω_o 방향으로 관찰된 반사된 방사선 L_o(p, \omega_o) 의 합을 계산합니다. 다시 말해, L_o점 p에 대한 조명이 ω_o 방향에서 보았을 때 반사된 조도(Irradiance) 의 합을 측정합니다.

반사 방정식은 조도(Irradiance) 를 중심으로 구성되며, 이는 우리가 측정하는 모든 입사 방사선의 합입니다. 단일 입사 방향뿐만 아니라, 점 p를 중심으로 하는 반구 Ω 내의 모든 입사 빛 방향에 대한 조도를 다룹니다. 반구는 표면 법선 n을 중심으로 정렬된 구의 절반으로 설명할 수 있습니다.
4. Archive/WhiteEngine/Attachments/Pasted image 20250313112026.png
영역 내 또는 (반구의 경우) 부피 내의 값을 계산하려면 적분이라는 수학적 구성을 사용합니다. 반사 방정식에서는 모든 입사 방향 dωi에 대해 Ω 반구 내에서 적분을 나타냅니다. 적분은 함수의 영역을 측정하는 방법으로, 이를 분석적으로 또는 수치적으로 계산할 수 있습니다. 렌더 방정식과 반사 방정식 모두에는 해석적인 해가 없기 때문에, 우리는 적분을 수치적으로 이산적으로 풀어야 합니다. 이는 반구 Ω에 걸쳐 반사 방정식의 작은 이산 단계 결과를 취하고 그 결과를 단계 크기에 따라 평균내는 것과 같습니다. 이를 리만 합(Riemann sum) 이라고 하며, 코드로 대략적으로 다음과 같이 시각화할 수 있습니다:

int steps = 100;
float sum = 0.0f;
vec3 P    = ...;
vec3 Wo   = ...;
vec3 N    = ...;
float dW  = 1.0f / steps;
for(int i = 0; i < steps; ++i) 
{
    vec3 Wi = getNextIncomingLightDir(i);
    sum += Fr(P, Wi, Wo) * L(P, Wi) * dot(N, Wi) * dW;
}

이산 단계들을 dW로 스케일링하면, 합은 적분 함수의 총 면적 또는 부피와 같아집니다. 각 이산 단계를 스케일링하는 dW는 반사 방정식의 dωi와 관련이 있습니다. 수학적으로 dωi는 우리가 적분을 계산하는 연속적인 기호이며, 코드에서 dW는 리만 합의 이산 단계이므로 직접적으로 관련되지는 않지만, 이렇게 생각하는 것이 도움이 될 수 있습니다. 이산 단계는 항상 함수의 총 면적에 대한 근사값을 제공한다는 점을 염두에 두세요. 주의 깊은 독자는 리만 합의 정확도를 높이기 위해 단계 수를 늘릴 수 있다는 것을 알게 될 것입니다.

반사 방정식은 점 p에 도달하는 모든 입사 빛 방향 ωi에 대한 방사선의 합을 계산하며, 이는 fr에 의해 스케일링되어 관찰자 방향으로 반사된 빛의 합 L_o를 반환합니다. 입사 방사선은 우리가 잘 아는 빛원에서 올 수 있으며, 또는 환경 맵에서 각 입사 방향의 방사선 값을 측정하여 올 수 있습니다. 환경 맵에 대한 자세한 내용은 IBL(이미지 기반 조명) 챕터에서 다룰 것입니다.

이제 남은 유일한 미지수는 표면의 재료 속성에 따라 입사 방사선을 스케일링하거나 가중치를 부여하는 fr 기호입니다. 이 frBRDF(양방향 반사 분포 함수)로 알려져 있습니다.

BRDF(Bidirectional Reflective Distribution Function)

BRDF(양방향 반사 분포 함수)는 입사 빛 방향 ωi, 출사(뷰) 빛 방향 ωo, 표면 법선 n, 그리고 마이크로 표면의 거칠기를 나타내는 표면 파라미터 a를 입력으로 받는 함수입니다. BRDF는 표면의 재료 속성에 따라 각 개별 빛의 광선 ωi가 불투명한 표면에서 최종 반사된 빛에 얼마나 기여하는지 근사합니다. 예를 들어, 표면이 완전히 매끄러운 표면(~거울처럼)이라면 BRDF 함수는 출사 광선 ωo와 동일한(반사된) 각도를 가진 광선에 대해서만 1.0을 반환하고, 나머지 모든 입사 광선 ωi에 대해서는 0.0을 반환합니다.

BRDF는 앞서 논의된 마이크로 표면 이론을 바탕으로 재료의 반사 및 굴절 특성을 근사합니다. 물리적으로 그럴듯한 BRDF는 에너지 보존 법칙을 준수해야 합니다. 즉, 반사된 빛의 합은 절대로 입사된 빛의 양을 초과할 수 없습니다. 기술적으로 Blinn-Phong은 ωiωo를 입력으로 받는 BRDF로 간주됩니다. 그러나 Blinn-Phong은 에너지 보존 원칙을 따르지 않기 때문에 물리적으로 기반을 둔 BRDF로 간주되지 않습니다. 표면이 빛에 반응하는 방식을 근사하기 위해 여러 가지 물리적으로 기반을 둔 BRDF가 존재하지만, 거의 모든 실시간 PBR 렌더 파이프라인에서는 Cook-Torrance BRDF가 사용됩니다.

Cook-Torrance BRDF는 확산 부분과 반사 부분을 모두 포함합니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313132459.png
여기서 kd​는 입사된 빛의 에너지 중 굴절되는 비율을 나타내고, ks​는 반사되는 비율을 나타냅니다. BRDF의 왼쪽 부분은 이 방정식의 확산 부분인 flambert를 나타냅니다. 이는 우리가 확산 음영 처리에 사용했던 Lambertian diffuse와 유사하며, 상수 인자 c로 표현됩니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313132507.png
여기서 c는 알베도(표면 색상, 즉 확산 표면 텍스처)입니다. π로 나누는 이유는 BRDF에 포함된 앞서 언급한 적분이 π로 스케일링되었기 때문입니다(이 부분은 IBL 챕터에서 다룰 예정입니다).

Lambertian 확산이 이전에 사용한 확산 조명과 어떻게 관련되는지 궁금할 수 있습니다. 이전에는 표면 색상에 표면 법선과 빛 방향 간의 내적을 곱하는 방식으로 확산 조명을 계산했습니다. 내적은 여전히 존재하지만, 이제 BRDF 밖으로 이동하여 n⋅ωiLo 적분의 마지막에서 찾을 수 있습니다.

BRDF의 확산 부분에 대해 더 사실적으로 보이지만 계산 비용이 더 높은 다른 방정식들이 존재합니다. 그러나 Epic Games의 결론에 따르면, Lambertian 확산은 대부분의 실시간 렌더링 목적에는 충분하다고 합니다.

BRDF의 반사 부분은 좀 더 고급 기술을 필요로 하며, 아래와 같이 설명됩니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313145946.png
Cook-Torrance 반사 BRDF는 세 개의 함수와 분모에 정규화 요소를 포함합니다. 각 D, F, G 기호는 표면의 반사 속성 중 특정 부분을 근사하는 함수 유형을 나타냅니다. 이 함수들은 각각 법선 분포 함수, 프레넬 방정식, 기하학 함수로 정의됩니다:

이 함수들은 각각 물리학적으로 근사된 값들이며, 각 함수는 물리학을 근사하는 다양한 방법을 시도합니다. 어떤 함수들은 더 사실적이고, 다른 함수들은 더 효율적일 수 있습니다. 어떤 근사된 버전을 사용하든 상관없습니다. Epic Games의 Unreal Engine 4에서 사용되는 함수는 Trowbridge-Reitz GGX (D), Fresnel-Schlick 근사법 (F), 그리고 Smith의 Schlick-GGX (G)입니다.

Normal distribution function

법선 분포 함수 D는 마이크로페셋들이 (중간) 벡터 h에 정확히 정렬된 상대 표면 면적을 통계적으로 근사합니다. 여러 종류의 NDF(Normal Distribution Functions)가 있으며, 이들은 주어진 거칠기 매개변수를 기반으로 마이크로페셋의 일반적인 정렬을 근사합니다. 우리가 사용할 NDFTrowbridge-Reitz GGX입니다:

4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313133912.png

여기서 h는 표면의 마이크로페셋을 측정하는 중간 벡터이며, α는 표면의 거칠기를 나타내는 지표입니다. h를 표면 법선과 빛 방향 사이의 중간 벡터로 설정하고, 거칠기 매개변수에 따라 다양한 결과를 시각적으로 나타내면 다음과 같은 결과가 나옵니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134029.png

Geometry function

기하학 함수는 마이크로 표면 세부 사항들이 서로 가려져 빛의 광선이 차단되는 상대적인 표면 면적을 통계적으로 근사합니다.
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134310.png
NDF와 유사하게, 기하학 함수는 재질의 거칠기 매개변수를 입력으로 받으며, 거친 표면은 마이크로패싯들이 서로 가려지는 확률이 더 높습니다. 우리가 사용할 기하학 함수는 GGX와 Schlick-Beckmann 근사를 결합한 Schlick-GGX입니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134413.png
여기서 kkk는 직접 조명과 IBL 조명에 대해 기하학 함수를 사용할 때 α의 재매핑 값입니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134428.png
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134442.png
α의 값은 엔진이 거칠기를 α로 변환하는 방식에 따라 다를 수 있습니다. 이 재매핑이 어떤 방식으로 적용되는지에 대해서는 다음 장에서 자세히 다룰 예정입니다.

기하학을 효과적으로 근사하기 위해서는 뷰 방향(기하학적 장애물)과 빛 방향 벡터(기하학적 그림자)를 모두 고려해야 합니다. 이를 위해 우리는 Smith 방법을 사용할 수 있습니다:

4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134558.png

Schlick-GGX를 Gsub로 사용하면, 거칠기 R에 따른 시각적 변화는 다음과 같습니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313134506.png

기하학 함수는 [0.0, 1.0] 범위의 곱셈 인자로, 1.0(또는 흰색)은 마이크로패싯 그림자가 전혀 없음을 측정하고, 0.0(또는 검은색)은 완전한 마이크로패싯 그림자가 있음을 측정합니다.

GLSL에서 기하학 함수는 다음과 같은 코드로 변환됩니다:

float GeometrySchlickGGX(float NdotV, float k)
{
    float nom   = NdotV;
    float denom = NdotV * (1.0 - k) + k;
	
    return nom / denom;
}
  
float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
{
    float NdotV = max(dot(N, V), 0.0);
    float NdotL = max(dot(N, L), 0.0);
    float ggx1 = GeometrySchlickGGX(NdotV, k);
    float ggx2 = GeometrySchlickGGX(NdotL, k);
	
    return ggx1 * ggx2;
}

Fresnel equation

프레넬 방정식(Fresnel equation)은 표면을 볼 때의 각도에 따라 반사된 빛과 굴절된 빛의 비율을 설명합니다. 빛이 표면에 닿을 때, 표면과의 시선 각도에 따라 반사되는 빛의 비율을 알려줍니다. 이 반사와 에너지 보존 원칙을 바탕으로 굴절된 빛의 양을 직접 구할 수 있습니다.

모든 표면이나 재료는 표면을 정면에서 볼 때 기본적인 반사율을 가지고 있지만, 표면을 기울어진 각도에서 볼 때 반사가 더욱 뚜렷하게 나타납니다. 예를 들어, 나무나 금속으로 된 책상을 생각해 보면, 책상 표면을 수직으로 바라볼 때 기본적인 반사율을 보이지만, 거의 90도 각도로 바라보면 반사가 훨씬 더 두드러집니다. 모든 표면은 이론적으로 90도 각도로 볼 때 완전히 반사된다고 할 수 있습니다. 이 현상을 프레넬 현상(Fresnel effect)이라고 하며, 프레넬 방정식으로 설명됩니다.

프레넬 방정식은 꽤 복잡하지만, 다행히도 프레넬-슐릭 근사(Fresnel-Schlick approximation)를 사용하여 근사할 수 있습니다:
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313135042.png
여기서 F0는 표면의 기본 반사율을 나타내며, 이는 굴절률(Refraction Index, IOR)을 사용하여 계산합니다. 구면 표면을 보면, 표면에 가까운 각도에서(반사각이 90도에 가까워질 때) 프레넬 효과와 반사가 강해짐을 확인할 수 있습니다.
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313135048.png
프레넬 방정식에는 몇 가지 미묘한 차이점이 있습니다. 하나는 프레넬-슐릭 근사가 사실상 유전체 또는 비금속 표면에 대해서만 정의된다는 점입니다. 전도체 표면(금속)의 경우 굴절률을 사용하여 기본 반사율을 계산하는 것이 제대로 맞지 않으며, 전도체에 대해선 전혀 다른 프레넬 방정식을 사용해야 합니다. 이는 불편하므로, 우리는 표면의 반응을 정상 입사각에서 미리 계산한 후 (F0), 즉 표면을 직접 바라보는 0도 각도로 계산하여 이를 보간합니다. 이렇게 하면 비금속과 금속 모두 같은 방정식을 사용할 수 있습니다.

표면의 정상 입사에서의 반응, 즉 기본 반사율은 대형 데이터베이스에서 찾을 수 있으며, Naty Hoffman의 강의 노트에서 가져온 일반적인 값들이 아래에 나와 있습니다.
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313135719.png
여기서 흥미로운 점은 모든 유전체 표면에서 기본 반사율이 0.17을 초과하지 않는다는 것입니다. 이는 예외적인 경우로, 대부분의 경우 기본 반사율이 0.17을 넘지 않습니다. 반면, 전도체 표면(금속)의 경우 기본 반사율이 훨씬 높게 시작하며(대부분 0.5에서 1.0 사이로 변동합니다). 또한, 전도체(또는 금속 표면)의 기본 반사율은 색조를 띕니다. 이 때문에 F0는 RGB 삼중체로 표현됩니다(정상 입사각에서의 반사율은 파장에 따라 다를 수 있습니다). 이는 금속 표면에서만 볼 수 있는 특징입니다.

금속 표면의 이러한 특성은 유전체 표면과 비교하여 금속 워크플로우라는 개념을 만들어냈습니다. 금속 워크플로우에서는 금속성과 비금속성을 구분하는 추가 파라미터인 "metalness"를 사용하여 표면 재질을 작성합니다.

이론적으로 재질의 금속성(metalness)은 이진적입니다. 즉, 어떤 재질이 금속이거나 아니거나 둘 중 하나이며, 둘 다일 수는 없습니다. 그러나 대부분의 렌더링 파이프라인에서는 표면의 금속성을 0.0에서 1.0까지 선형적으로 설정할 수 있도록 허용합니다. 이는 주로 재질 텍스처의 정밀도가 부족하기 때문입니다. 예를 들어, 금속 표면 위에 작은 비금속 먼지나 모래 같은 입자 또는 스크래치가 있는 경우, 이진적인 금속성 값만으로 이를 정확하게 표현하기가 어렵습니다.

F0를 유전체와 도체 모두에 대해 미리 계산하면 동일한 Fresnel-Schlick 근사식을 두 표면 유형에 모두 사용할 수 있습니다. 하지만 금속 표면의 경우 기본 반사율을 색상에 맞게 조정해야 합니다. 일반적으로 다음과 같이 처리합니다:

vec3 F0 = vec3(0.04);
F0      = mix(F0, surfaceColor.rgb, metalness);

우리는 대부분의 유전체 표면에 대해 근사된 기본 반사율을 정의합니다. 이것은 또 다른 근사치이며, F0 값은 일반적인 유전체의 평균값을 기반으로 합니다. 기본 반사율 0.04는 대부분의 유전체에 대해 물리적으로 타당한 결과를 제공하며, 추가적인 표면 매개변수를 설정하지 않아도 됩니다. 그런 다음 표면의 금속성 정도에 따라 유전체의 기본 반사율을 유지하거나 표면 색상 자체를 F0로 사용합니다. 금속 표면은 모든 굴절된 빛을 흡수하므로 확산 반사가 없으며, 표면 색상 텍스처를 직접 기본 반사율로 사용할 수 있습니다.

코드에서 Fresnel-Schlick 근사는 다음과 같이 표현됩니다:

vec3 fresnelSchlick(float cosTheta, vec3 F0)
{
    return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}

여기서 cosTheta는 표면의 법선 벡터 n과 하프 벡터 h(또는 뷰 벡터 v)의 내적(dot product) 결과입니다.

Cook-Torrance reflectance equation

쿠크-토랜스 BRDF의 모든 구성 요소를 설명했으므로, 이제 이를 포함하여 최종적인 반사 방정식(Reflectance Equation) 을 정의할 수 있습니다.
4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313142340.png
그러나 이 식은 완전히 수학적으로 올바른 형태는 아닙니다.
Fresnel 항 F는 표면에서 반사되는 빛의 비율을 나타냅니다. 즉, 이것이 곧 반사 비율 ks이므로, 반사 방정식의 스펙큘러(BRDF) 항은 이미 반사 비율을 포함하고 있습니다.

이를 반영하여 최종적인 반사 방정식을 다음과 같이 정리할 수 있습니다.

4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313142414.png
이제 이 방정식은 물리적으로 기반이 된 렌더링 모델(Physically Based Rendering, PBR) 을 완전히 설명합니다.
지금 당장 이 수식을 코드로 구현하는 방법이 이해되지 않더라도 걱정하지 마세요.
다음 장에서 이 반사 방정식을 어떻게 활용하여 더 현실적인 조명 결과를 얻을 수 있는지 다룰 것이며, 지금까지 배운 개념들이 점차 하나로 연결될 것입니다.

PBR 머티리얼 제작

PBR의 기초가 되는 수학적 모델을 이해했다면, 이제 아티스트들이 표면의 물리적 특성을 어떻게 정의하는지 살펴보겠습니다.
이러한 표면 특성은 PBR 방정식에 직접 입력될 수 있으며, 대부분의 경우 **텍스처(Texture)**를 사용하여 표현됩니다.

텍스처를 사용하면 각 표면의 개별 픽셀(프래그먼트, Fragment) 단위로 조명에 대한 반응을 조정할 수 있습니다.
예를 들면, 특정 부분이 금속인지, 거친지, 부드러운지, 또는 빛의 파장에 따라 어떻게 반응하는지 등을 지정할 수 있습니다.

아래는 PBR 렌더링에서 자주 사용되는 텍스처 유형과 그 출력 결과를 정리한 목록입니다.

4. Archive/WhiteEngine/PBR/Attachments/Pasted image 20250313142742.png

PBR을 사용하면 환경이나 조명 설정에 상관없이 표면의 물리적 특성이 유지되므로, 아티스트들은 보다 직관적으로 **물리적으로 타당한 결과(Physically Plausible Results)**를 얻을 수 있습니다.
또한, PBR로 제작된 머티리얼은 다른 PBR 렌더링 엔진에서도 쉽게 공유 및 재사용 가능하며, 어떤 환경에서도 자연스럽고 사실적인 결과를 제공합니다.

Further reading